# 1-导包
from api.api_approve_trust import ApiApproveTrust
from api.api_register_login import ApiRegisterLogin
from api import log
import traceback
import requests
from common.bs_util import html_parser
import pytest
from data.approve import approve_data, recharge_code, recharge


# 2-定义认证接口类
class TestApproveTrust:
    # 测试准备
    def setup(self):
        # 1-初始化会话
        self.session = requests.Session()
        # 2、获取认证充值封装对象
        self.approve = ApiApproveTrust(self.session)
        # 3、获取登录注册封装对象
        self.ApiRegisterLogin = ApiRegisterLogin(self.session)
        # 4、调⽤登录成功,完成登录验证，才能执行后续的接口测试哦[比如实名认证接口必须先登录获取cookie才能进行认证后]
        self.ApiRegisterLogin.api_login(18888888801, "test123")

    # 结束清理
    def teardown(self):
        # 关闭会话
        self.session.close()

    # 1、认证接口 测试
    @pytest.mark.parametrize("param", approve_data)
    def test01_approve(self, param):
        try:
            # 调用实名认证接口执行测试
            res = self.approve.api_approve(realname=param["realname"], card_id=param["card_id"])
            log.info("1-实名认证接口测试执行返回结果为：{}".format(res.text))
            # 断言
            assert param["expect_text"] in res.text
            log.info("2-实名认证接口测试断言通过！")
        except Exception as e:
            # 记录异常日志
            log.error("断言错误！原因：{}".format(traceback.format_exc()))
            # 抛出异常
            raise

    # 2-获取认证信息接口 测试
    def test02_get_approve(self):
        try:
            # 调用认证状态接口
            res = self.approve.api_approve_status()
            log.info("1-获取认证信息接口执行结果为：{}".format(res.text))
            # 断言
            assert "张" in res.text
            log.info("2-获取认证信息接口测试断言通过！")
        except Exception as e:
            # 记录异常日志
            log.error("获取认证信息接口测试出现异常：{}".format(traceback.format_exc()))
            # 抛出异常
            raise

    # 3-开户接口 测试
    def test03_trust(self):
        try:
            # 调用认证接口
            res = self.approve.api_trust()
            log.info("1-认证接口执行结果为：{}".format(res.json()))
            # 断言
            assert "form" in res.text
            log.info("2-认证接口执行断言通过！")
            # 执行三方开户
            html = res.json()["description"]["form"]  # 从接口响应的json文件中提取html数据
            result = html_parser(html=html)
            # 期望  (http://xxxx,{"Version":10,})
            res = self.session.post(url=result[0], data=result[1])  # 执行三方接口请求
            log.info("3-三方开户的执行结果为：{}".format(res.text))
            assert "OK" in res.text
            log.info("4-开户接口执行断言通过！")
        except Exception as e:
            # 记录异常日志
            log.error("开户接口测试出现异常：{}".format(traceback.format_exc()))
            # 抛出异常
            raise

    # 4-获取充值验证码接口 测试
    @pytest.mark.parametrize("param", recharge_code)
    def test04_recharge_code(self, param):
        try:
            # 调用接口
            r = self.approve.api_img_code(random=param["random"])
            log.info("1-获取充值验证码接口执行结果为：{}".format(r.status_code))
            # 断言
            assert param["expect_code"] == r.status_code
            log.info("2-获取充值验证码接口断言通过！")
        except Exception as e:
            # 日志
            log.error("获取充值验证码接口测试出现异常：{}".format(traceback.format_exc()))
            # 抛异常
            raise

    # 5-充值接口 测试
    @pytest.mark.parametrize("param", recharge)
    def test05_recharge(self, param):
        try:
            # 调用充值图片验证码接口
            self.approve.api_img_code()
            # 调用充值接口
            res = self.approve.api_recharge(valicode=param["valicode"])
            log.info("1-充值接口执行测试返回结果为：{}".format(res.json()))
            if "OK" in param["expect_text"]:
                # 断言
                assert "form" in res.text
                log.info("2-充值接口测试断言通过！")
                # 三方充值
                html = res.json()["description"]["form"]  # 从接口响应的json文件中提取html数据
                result = html_parser(html=html)
                # 期望  (http://xxxx,{"Version":10,})
                res = self.session.post(url=result[0], data=result[1])  # 执行三方接口请求
                log.info("3-三方充值的结果为：{}".format(res.text))
            assert param["expect_text"] in res.text
            log.info("4-三方充值接口测试断言通过！")
        except Exception as e:
            # 记录异常日志
            log.error("充值接口执行出现异常：{}".format(traceback.format_exc()))
            # 抛出异常
            raise
